#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <time.h>
#include <string.h>
  
/**
 * 转义序列中的 \033 是八进制表示的 Escape 字符（ASCII 27），它也可以表示为 \e 或 \x1b
 * 
 * 光标类：
 * \033[A   光标向上移动一行
 * \033[B   光标向下移动一行
 * \033[C   光标向右移动一列
 * \033[D   光标向左移动一列
 * \033[nG  光标移动到第 n 列
 * \033[nJ  清除从光标到行尾的内容（如果 n 为 0）或清除整个屏幕（如果 n 为 1，等同于 \033[2J）
 *          或清除从光标到行首的内容（如果 n 为 2）
 * \033[H   光标移动到屏幕的左上角
 * \033[n;mH    光标移动到屏幕上的第n行m列
 * \033[s   保存当前光标位置
 * \033[u   恢复之前保存的光标位置
 * \033[2J  清除整个屏幕
 * \033[1J  清除从光标到屏幕底部的内容
 * \033[?25l    隐藏光标
 * \033[?25h    显示光标
 * \033[K   清除从光标到行尾的内容
 * \033[S   向上滚动一行
 * \033[T   向下滚动一行
 * 
 * 文本颜色与样式
 * \033[0m  重置为默认颜色
 * \033[30m 到 \033[37m     设置前景色（文本颜色）为黑色到白色
 *                          30：黑色文本 31：红色文本 ...(跟下面差不多)
 * \033[40m 到 \033[47m     设置背景色为黑色到白色
 *                          40：黑色背景 41：红色背景 42：绿色背景 43：黄色背景
 *                          44：蓝色背景 45：洋红色（紫色）背景 46：青色背景 47：白色背景
 * \033[1m  设置高亮度（通常只影响前景色）
 * \033[4m  下划线
 * \033[5m  闪烁（并非所有终端都支持）
 * \033[7m  反转颜色（即交换前景色和背景色）
 * \033[i,j,km  i,j,k分别对应上面前景色，背景色及文本样式（下划线，闪烁等），且具体应该跟顺序无关，与值有关
 * 
 * \n   换行
 * \r   将光标移动到当前行的开始位置
 * \t   制表符
 */
  
/**
 * printf打印：
 * （打印最多50字节长度的字符串）
 * printf("[%.*s]\r", 50, arr);
 * （打印至少100字节的字符串，且左对齐，超过则继续打印。若需要右对齐则不要'-'符号）
 * printf("[%-100s]\r", arr);
 * 
 */

void p1() {
    printf("\033[2J\033[1;1H");	//清除打印屏幕端口
    /*打印的数据内容*/
    static int x=0;
    for(int i=0;i<8;i++)
    {
        printf("X = %3d",x++); //一定要输出对应的数据宽度，不然容易出现打印混乱
    }
    printf("\033[1;1H");	//光标移动到左上角重新开始打印
}



void p2(){
    //进度条大小
    #define SIZE 102
    //进度条样式
    #define STYLE '='
    //进度条指示器
    #define S '>'

    const char* tmp="|/-\\";//是否处于加载中
    char arr[SIZE];
    memset(arr,0,sizeof(arr));
    int i=0;

    while (i<=100) {
        // 简单版
  	    // printf("[%-100s]][%d%%][%c]\r",arr,i,tmp[i%4]);
  	    // 设置进度条样式，添加背景色，字体颜色等
        printf("[\033[43;31;1m%-100s\033[0m]][%d%%][%c]\r",arr,i,tmp[i%4]);
        fflush(stdout);                                                              
        arr[i++]=STYLE;
        if(i != 100) arr[i]=S;
        usleep(100000); //100000微秒
    }
    printf("\n");
}

void p3() {
    int i=0;
    while (i<=100) {
        printf("%d\n", i++);
        printf("倒计时中\033[A\r");
        sleep(1);
    }
}

void p4() {
    printf("10秒倒计时如下:\n");
	for(int i = 10; i > -1; --i) {
		printf("i = %d\n", i);
		//将当前光标往上移动一行
		printf("\033[A");
		//删除光标后面的内容
		printf("\033[K");
		sleep(1);
	}
	printf("surprise!\n");
}

